package org.dev.app.service.impl;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.dev.app.service.DeptService;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * @author wangzhuangzhuang
 * @Description:
 * @date 2022-05-26 16:06
 */
@Service("deptService")
public class DeptServiceImpl implements DeptService {

	@Override
	public String deptInfo_Ok(Integer id) {
		return "线程池： " + Thread.currentThread().getName() + " deptInfo_Ok, id: " + id;
	}
	/*
	* 方法上使用@HystrixCommand注解的说明：
	* 1. 参数fallbackMethod属性用于指定降级方法。
	* 2. 参数execution.isolation.thread.timeoutInMilliseconds用于设置自身调用超时时间的峰值，峰值内可以正常运行，否则执行降级方法
	* */

	//一旦该方法失败并抛出了异常信息后，会自动调用  @HystrixCommand 注解标注的 fallbackMethod 指定的方法
	@HystrixCommand(fallbackMethod = "dept_TimeoutHandler",
			commandProperties =
					//规定 5 秒钟以内就不报错，正常运行，超过 5 秒就报错，调用指定的方法
					{@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")})
	@Override
	public String deptInfo_Timeout(Integer id) {
		int outTime = 4; // 小于超时时间 5 s
		try {
			TimeUnit.SECONDS.sleep(outTime);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return "线程池：" + Thread.currentThread().getName() + "  deptInfo_Timeout,id:   " + id + "  耗时: " + outTime;
	}

	// 当服务出现故障后，调用该方法给出友好提示
	public String dept_TimeoutHandler(Integer id) {
		return "系统繁忙请稍后再试！" + "线程池：" + Thread.currentThread().getName() + "  deptInfo_Timeout,id:   " + id;
	}
}